
// 重写 ES5 的数组扩展方法

/**
 * forEach
 * map
 * filter
 * reduce
 * reduceRight
 * every
 * some
 * 
 * 需要用到 deepClone
 */

var obj = {
  name: 'charlie',
  age: 22,
  career: 'front end Engineer',
  info: {
    fields: ['HTML', 'CSS', 'JS'],
    framework: ['Vue', 'React'],
    friends: [
      {
        name: '张三',
        age: 21
      },
      {
        name: '李四',
        age: 23
      }
    ]
  },
  hobby: ['play games', 'travel', 'study'],
  schedule: {
    travel: '2021-12-10',
    study: '2021-12-20',
    // now: new Date('2021-12-10'),
  }
}

// var cloneObj = deepCloneES6(obj);
// var cloneObj = deepClone(obj);
// console.log(cloneObj);


var arr = [
  {
    name: '张三',
    age: 34
  },
  {
    name: '李四',
    age: 25
  },
  {
    name: '王五',
    age: 21
  },
  {
    name: '赵六',
    age: 28
  }
]

var obj = {
  name: 'Jacky',
  age: 33
}


// --------------------------------------------------

// arr.forEach(function (item, index, array) {
//   console.log(this.name);
//   console.log(item, index, array);
// }, obj)

// console.log('---------')

// arr.myForEach(function (item, index, array) {
//   console.log(this.name);
//   console.log(item, index, array);
// }, obj)


// --------------------------------------------------


// var newArr = arr.map(function (item, index, array) {
//   console.log(this.name);
//   console.log(item, index, array);
//   return item;
// }, obj);

// console.log(newArr);

// console.log('---------')

// var newArr2 = arr.myMap(function (item, index, array) {
//   console.log(this.name);
//   console.log(item, index, array);
//   return item;
// }, obj);

// console.log(newArr2);


// --------------------------------------------------


// var newArr = arr.filter(function (item, index, array) {
  // return true;
  // return false;
//   console.log(this.name);
//   return item.age > 25;
// }, obj);

// console.log(newArr);

// console.log('---------')

// var newArr2 = arr.myFilter(function (item, index, array) {
  // return true;
  // return false;
//   console.log(this.name);
//   return item.age > 25;
// }, obj);

// console.log(newArr2);


// --------------------------------------------------


// 测试一个数组内的所有元素是否都能通过某个指定函数的测试。返回一个布尔值
// var res = arr.every(function (item, index, array) {
  // console.log(item, index, array);
  // console.log(this);
  // return true;
  // return false;
  // return item.age < 25;
//   return item.age < 40;
// }, obj);

// console.log(res);

// console.log('---------')

// var res2 = arr.myEvery(function (item, index, array) {
  // console.log(item, index, array);
  // console.log(this);
  // return true;
  // return false;
  // return item.age < 25;
//   return item.age < 40;
// }, obj);

// console.log(res2);


// --------------------------------------------------

// 测试数组中是不是至少有1个元素通过了某个指定函数的测试 返回一个布尔值
// var res = arr.some(function (item, index, array) {
//   console.log(item, index, array);
//   console.log(this);
//   return item.age > 40;
// }, obj);

// console.log(res);

// console.log('---------')

// var res2 = arr.mySome(function (item, index, array) {
//   console.log(item, index, array);
//   console.log(this);
//   return item.age > 40;
// }, obj);

// console.log(res2);


// --------------------------------------------------


// 对数组中的每个元素执行一次
// 提供的reducer函数(升序执行)，将其结果汇总为单个返回

// var initialValue = [{
//   name: '小明',
//   age: 12
// }];
// var i = 0;

// var newArr = arr.reduce(function (prev, item, index, array) {
//   console.log(this);
  // console.log(prev === initialValue) // true
  // console.log(prev) // prev 可看作一个容器
  // i ++;
  // prev.push(i);
//   item.age >= 25 && prev.push(item);
//   return prev;
// }, initialValue, obj);

// console.log(newArr);

// console.log('-----------------')

// var initialValue2 = [{
//   name: '小明',
//   age: 12
// }];
// var i2 = 0;

// var newArr2 = arr.myReduce(function (prev, item, index, array) {
//   console.log(this);
  // console.log(prev === initialValue) // true
  // console.log(prev) // prev 可看作一个容器
  // i2 ++;
  // prev.push(i2);
//   item.age >= 25 && prev.push(item);
//   return prev;
// }, initialValue2, obj)

// console.log(newArr2);


// --------------------------------------------------


// 接受一个函数作为累加器（accumulator）
// 和数组的每个值（从右到左）将其减少为单个值。

var initialValue = [{
  name: '小明',
  age: 12
}];

var newArr = arr.reduce(function (prev, item, index, array) {
  item.age >= 25 && prev.push(item);
  return prev;
}, initialValue);

console.log(newArr);

console.log('-----------------------')

var initialValue2 = [{
  name: '小明',
  age: 12
}];

var newArr2 = arr.reduceRight(function (prev, item, index, array) {
  item.age >= 25 && prev.push(item);
  return prev;
}, initialValue2);

console.log(newArr2);

console.log('-----------------------')

var initialValue3 = [{
  name: '小明',
  age: 12
}];

var newArr3 = arr.myReduce(function (prev, item, index, array) {
  item.age >= 25 && prev.push(item);
  return prev;
}, initialValue3);

console.log(newArr3);

console.log('-----------------------')

var initialValue4 = [{
  name: '小明',
  age: 12
}];

var newArr4 = arr.myReduceRight(function (prev, item, index, array) {
  item.age >= 25 && prev.push(item);
  return prev;
}, initialValue4);

console.log(newArr4);


